/**
 * 
 */
package com.spgf.control.facedes;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import com.archtecture.control.exceptions.NegocioException;
import com.archtecture.control.facedes.PersistenceFacadeRemote;
import com.spgf.control.enums.Mes;
import com.spgf.control.enums.TipoCobranca;
import com.spgf.control.models.Categoria;

/**
 * @author Administrador
 * 
 */
@Stateless
public class VisualizarRecursosFacade implements VisualizarRecursosFacadeRemote {

	@EJB
	private PersistenceFacadeRemote	persistenceFacade;

	@Override
	public List<Categoria> buscarCategriasPorMes(Mes mes, TipoCobranca tipoCobranca) {

		Date dataInicial = new GregorianCalendar(Calendar.getInstance().get(Calendar.YEAR), mes.ordinal(), 1, 0, 0).getTime();
		Date dataFinal = new GregorianCalendar(Calendar.getInstance().get(Calendar.YEAR), mes.ordinal(), 31, 23, 59).getTime();

		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

		StringBuilder jpql = new StringBuilder();
		jpql.append("SELECT DISTINCT cat FROM Categoria cat ");
		jpql.append("JOIN FETCH cat.lancamentos lanc ");
		jpql.append("WHERE ");
		// jpql.append("lanc.data BETWEEN '");
		// jpql.append(sdf.format(dataInicial));
		// jpql.append("' AND '");
		// jpql.append(sdf.format(dataFinal));
		// jpql.append("' ");

		if (tipoCobranca != null) {
			jpql.append("cat.tipo = ");
			jpql.append(tipoCobranca.ordinal());
		}

		List<Categoria> categorias = persistenceFacade.executarJPQLResultadoMultiplo(jpql.toString());

		for (Categoria categoria : categorias) {
			jpql = new StringBuilder();
			jpql.append("SELECT sum(lanc.valor) FROM Lancamento lanc ");
			jpql.append("JOIN lanc.categoria cat ");

			jpql.append("WHERE ");
			/*
			 * jpql.append("lanc.data BETWEEN '"); jpql.append(sdf.format(dataInicial)); jpql.append("' AND '"); jpql.append(sdf.format(dataFinal));
			 * jpql.append("' "); jpql.append(" AND");
			 */

			jpql.append(" cat.codigo = ");
			jpql.append(categoria.getCodigo());

			if (tipoCobranca != null) {
				jpql.append(" AND cat.tipo = ");
				jpql.append(tipoCobranca.ordinal());
			}

			Double valor = 0.0;

			try {
				valor = persistenceFacade.executarJPQLResultadoUnico(jpql.toString());
			} catch (NegocioException e) {
				// TODO locar
				e.printStackTrace();
			}
			categoria.setValor(valor);
		}

		return categorias;
	}

}
